/*
 * Cliente.cpp
 *
 *  Created on: 28/05/2012
 *      Author: sebastian
 */

#include "Cliente.h"
#include "Respuesta.h"
#include "Consulta.h"
#include "Hilo_Enviador_Cliente.h"
#include "Hilo_Recibidor_Cliente.h"
#include "VentanaPrincipal.h"

Cliente::Cliente() {
	socket = new Socket("4321");
}

Cliente::~Cliente() {
	delete socket;
}

void Cliente::conectar() {
	std::string dir("localhost");
	socket->conectar(dir);
}

void Cliente::desconectar() {
	socket->cerrar();
}

void Cliente::enviarConsulta(Consulta* c) {
	std::string con_s = c->serializar();
	socket->enviar(con_s);
}

std::string Cliente::recibirRespuesta() {
	char buffer[300];
	for(int i = 0; i < 300; ++i)
		buffer[i] = 0;
	//strcpy(buffer, "");
	std::string buf;
	do {
		int i = socket->recibir(buffer, 300);
		if(i < 0)
			throw(1);
		std::string aux(buffer);
		buf.append(aux);
	} while (buf.find('@') == std::string::npos);
	int pos = buf.find('@');
	buf[pos] = 0;
	return buf;
}

void Cliente::setVentana(VentanaPrincipal* ventana) {
	this->ventana = ventana;

}


void Cliente::run() {
	Hilo_Enviador hi(*this, *socket);
	Hilo_Recibidor hr(*this, *socket);
	hi.start();
	hr.start();
	while(isRunning()) {
		//sleep(1);
		Respuesta* respuesta = popRespuesta();
		ventana->setRespuesta(respuesta);

	}
	hi.stop();
	hr.stop();
	desconectar();
	consultas.broadcast();
	respuestas.broadcast();
	hi.join();
	hr.join();
}

void Cliente::pushRespuesta(Respuesta* r) {
	respuestas.push(r);
}

Respuesta* Cliente::popRespuesta() {
	Respuesta* resp;
	try {
		resp = respuestas.pop();
	} catch(int i) {
		return NULL;
	}
	return resp;
}

void Cliente::pushConsulta(Consulta* cons) {
	consultas.push(cons);
}

Consulta* Cliente::popConsulta() {
	Consulta* cons;
	try {
		cons = consultas.pop();
	} catch(int i) {
		return NULL;

	}
	return cons;
}
